package com.example.threaddemo;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;


/**
 * 1.可以抛异常
 * 2.可以有返回值
 */
class Thread3 implements Callable {

    @Override
    public Integer call() throws Exception {
        System.out.println("实现 callable 接口");
        TimeUnit.SECONDS.sleep(2);
        return 100;
    }
}

/**
 * callable 的线程
 */
public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        /**
         * 1. 实现了 runable 接口，(因此通用代码中实现多个接口，加了关联且解耦)
         * 2. 通过构造注入 callable
         */
        //此时两个线程：1.main线程；2.AA线程
        //类似单独同时开小灶，最后要结果
        FutureTask<Integer> futureTask = new FutureTask(new Thread3());
        new Thread(futureTask, "AA").start();
        //多个线程抢同一个 futureTask ，只执行一次即可
        new Thread(futureTask, "BB").start();
        //此时两个线程同时执行，互不耽搁

        int result01 = 100;

        while (!futureTask.isDone()) {
//            System.out.println("等待 futureTask 的执行");
        }
        //要获得 callable 线程的计算结果，如果没有计算完成，
        //就要去强求，会导致阻塞，直到计算完成
        //尽量放在最后 或使用 while 代码块
        int result02 = futureTask.get();

        System.out.println("***********result*********" + (result01 + result02));
    }
}
